#define MENU_MONO_MAIN
#include "string.h"
#include "..\sys\sys_base0\utility.h"
#include "..\func_key32\key.h"
#include "Menu_Mono.h"

extern unsigned char b_flash_250ms;

void Menu_Mono_Disp_TXT(char *buf,MENU_TXT_T *p);
void get_disp_data(MENU_MONO_DATA_T *u,MENU_DATA_DISP_T *p);
void Menu_Mono_Disp_DATA(char *buf,MENU_DATA_DISP_T *p,unsigned long ctrl);
void Menu_Mono_Disp_DATA_SET(MENU_MONO_T *p,MENU_DATA_SET_T *comp);
void Menu_Mono_Disp_TXT_DATA_SET(MENU_MONO_T *p,MENU_TXT_DATA_SET_T *comp);
void Menu_Mono_Disp_TXT_DATA(char *buf,MENU_TXT_DATA_DISP_T *p,unsigned long ctrl);
void Menu_Mono_Disp_BMP(MENU_MONO_T *p,MENU_BMP_T *comp);
void set_disp_rev_buf(char *buf,char *s,unsigned short n,unsigned long ctrl);

extern void clr_disp_buf(void);


//转入新的菜单，菜单下包含多页
void Menu_Mono_NewMenu(MENU_MONO_T *p,unsigned char newmenu,unsigned char newpage)
{
	int i;
	
	p->menu_reset=0;
	
	p->last_menu=p->cur_menu;	//记录当前菜单
	p->cur_menu=newmenu;
	
	if(newmenu == MENU_PASSWORD)
	{
		//p->last_menu=p->cur_menu;	//记录当前菜单
		p->last_page=p->cur_page;	//记录当前页
		//p->cur_menu=newmenu;
		p->page_n=1;
		p->pages=p->pages_password;
	}
	else if(newmenu >= p->menu_n)
	{
		return;
	}
	else
	{
		p->cur_menu=newmenu;
		
		p->pages = p->menus[newmenu];
		for(i=0;;)
		{
			if(p->pages[i]==NULL)
			{
				break;
			}
			i++;
		}
		p->page_n=i;
		if(newpage >= i)
		{
			return;
		}
	}
	
	Menu_Mono_NewPage(p,newpage);		//切到本菜单的第0页
}


void Menu_Mono_NextMenu(MENU_MONO_T *p)
{
	int i;
	
	i=p->cur_menu;
	if(++i>=p->menu_n)
	{
		i=0;
	}
	//p->cur_menu=i;
	Menu_Mono_NewMenu(p,i,0);
	
}

void Menu_Mono_PrevMenu(MENU_MONO_T *p)
{
	int i;
	
	i=p->cur_menu;
	if(--i<0)
	{
		i=p->menu_n-1;
	}
	
	//p->cur_menu=i;
	Menu_Mono_NewMenu(p,i,0);
}


//转入新的页
void Menu_Mono_NewPage(MENU_MONO_T *p,unsigned char newpage)
{
	int i;
	const void *p_comp;
	
	
	if(newpage >= p->page_n)
	{
		return;
	}
	
	p->cur_page=newpage;
	p->cur_comp=0;
	p->cur_sel=CUR_SEL_NULL;
	p->layer=DISP_LAYER_BASIC;
	p->page=p->pages[newpage];
		
	for(i=0;;)
	{
		p_comp=p->page[i];
		if(p_comp==NULL)
		{
			break;
		}
		i++;
	}
	
	p->comp_n=i;
	clr_disp_buf();
}


unsigned char Menu_Mono_Basic(MENU_MONO_T *p,unsigned char key_code)
{
	if(key_code==KEY_CODE_RIGHT)
	{
		Menu_Mono_NextMenu(p);
		key_code=KEY_CODE_NULL;
	}
	else if(key_code==KEY_CODE_LEFT)
	{
		Menu_Mono_PrevMenu(p);
		key_code=KEY_CODE_NULL;
	}
	else if(key_code==KEY_CODE_DOWN)
	{
		Menu_Mono_NextPage(p);
		key_code=KEY_CODE_NULL;
	}
	else if(key_code==KEY_CODE_UP)
	{
		Menu_Mono_PrevPage(p);
		key_code=KEY_CODE_NULL;
	}
	else if(key_code==KEY_CODE_OK)
	{
		Menu_Mono_NextLayer(p);
		key_code=KEY_CODE_NULL;
	}
	else if(key_code==KEY_CODE_CANCEL)
	{
		//Menu_Mono_PrevMenu(p);
		key_code=KEY_CODE_NULL;
	}
	return(key_code);
}


void Menu_Mono_NextSel(MENU_MONO_T *p)
{
	
	unsigned char j,cp,cs;
	U_COPONENT_T *u;
	
	cp=p->cur_page;		//记录当前页
	cs=p->cur_sel;		//记录当前选择项
	
	j=cs;

	do
	{
		if(++j >= p->comp_n)
		{
			if(cs==CUR_SEL_NULL)
			{
				j=CUR_SEL_NULL;
				break;
			}
			j=0;
			//Menu_Mono_NextPage(p);	//不切换到下一页
			//p->layer=DISP_LAYER_SEL;
		}
		u=(U_COPONENT_T *)p->page[j];
			
		if(u->type==CTP_DATA_SET || u->type==CTP_TXT_DATA_SET)
		{
			break;
		}
		
	}while(cp != p->cur_page || cs != j);
	if(j!=CUR_SEL_NULL)
	{
		p->cur_sel=j;
	}
	else
	{
		p->cur_sel=CUR_SEL_NULL;
	}
}


void Menu_Mono_PrevSel(MENU_MONO_T *p)
{
	unsigned char j,cp,cs;
	U_COPONENT_T *u;
	
	if(p->cur_sel==CUR_SEL_NULL)
	{
		return;
	}
	
	
	cp=p->cur_page;		//记录当前页
	cs=p->cur_sel;		//记录当前选择项
	j=cs;
		
	do
	{
		if(--j & 0x80)
		{
			Menu_Mono_PrevPage(p);
			j=p->comp_n-1;
			p->layer=DISP_LAYER_SEL;
		}
		
		u=(U_COPONENT_T *)p->page[j];
			
		if(u->type==CTP_DATA_SET || u->type==CTP_TXT_DATA_SET)
		{
			break;
		}
	}while(cp != p->cur_page || cs != j);
	
	p->cur_sel=j;
	
}


unsigned char Menu_Mono_Sel(MENU_MONO_T *p,unsigned char key_code)
{
	if(key_code==KEY_CODE_DOWN)
	{
		Menu_Mono_NextSel(p);
		key_code=KEY_CODE_NULL;
	}
	else if(key_code==KEY_CODE_UP)
	{
		Menu_Mono_PrevSel(p);
		key_code=KEY_CODE_NULL;
	}
	else if(key_code==KEY_CODE_CANCEL)
	{
		Menu_Mono_PrevLayer(p);
		key_code=KEY_CODE_NULL;
	}
	else if(key_code==KEY_CODE_OK)
	{
		Menu_Mono_NextLayer(p);
		key_code=KEY_CODE_NULL;
	}
	return(key_code);
}


unsigned char Menu_Mono_Edit(MENU_MONO_T *p,unsigned char key_code)
{
	unsigned char r;
	r=Number_Edit(&p->edit,key_code);
	if(p->edit.b_edit==0)
	{
		p->layer--;
		if(p->cur_menu == MENU_PASSWORD)
		{									//从密码设定中返回
			Menu_Mono_NewMenu(p,p->last_menu,p->last_page);
			if(p->psd_buf==p->super_psd || ((p->p_userpsd != NULL) && (p->psd_buf==*p->p_userpsd)))
			{
				p->lock_level=LOCK_LEVEL_UNLOCK;
				left_ms_set(&p->lock_tm,PASSWORD_UNLOCK_TIMEDOUT);
				Menu_Mono_NextLayer(p);
			}
			p->psd_buf=0;
		}
	}
	return(r);
}

void Menu_Mono_StartEdit(MENU_MONO_T *p)
{
	U_COPONENT_T *u;
	VAL_PROPERTY_T property;
	
	u=(U_COPONENT_T *)p->page[p->cur_sel];
	
	if(u->type==CTP_DATA_SET)
	{
		property.adr=u->data_set.rd_adr;
		property.max=u->data_set.max;
		property.min=u->data_set.min;
		property.val_type=m_VTP(u->data_set.var_property);
		property.dec_nb=m_DP_DEC_NB(u->data_set.disp_property);
	}
	else if(u->type==CTP_TXT_DATA_SET)
	{
		property.adr=u->txt_data_set.rd_adr;
		property.max=u->txt_data_set.index_n-1;
		property.min=0;
		property.val_type=m_VTP(u->txt_data_set.var_property);
		property.dec_nb=0;
	}
		
	Number_Edit_Init(&p->edit,&property);
}


void Menu_Mono_NextLayer(MENU_MONO_T *p)
{
	if(p->layer==DISP_LAYER_BASIC)
	{								//从基本层转入选择层	
		p->cur_sel=CUR_SEL_NULL;
		Menu_Mono_NextSel(p);

		if(p->cur_sel!=CUR_SEL_NULL)
		{
			if(p->lock_level != LOCK_LEVEL_LOCK || p->pages_password==NULL || p->cur_menu==MENU_PASSWORD)
			{
				p->layer++;
			}
			else
			{
				Menu_Mono_NewMenu(p,MENU_PASSWORD,0);
				p->layer=DISP_LAYER_EDIT;
				p->cur_sel=1;
				Menu_Mono_StartEdit(p);
			}
		}
	}
	else if(p->layer==DISP_LAYER_SEL)
	{								//从选择层转入编辑层
		if(p->cur_sel!=CUR_SEL_NULL)
		{			
			Menu_Mono_StartEdit(p);
			p->layer++;
		}
	}
}


void Menu_Mono_Layer_BAsic(MENU_MONO_T *p)
{
	p->layer=DISP_LAYER_BASIC;
	p->cur_sel=0xff;
}

void Menu_Mono_PrevLayer(MENU_MONO_T *p)
{
	if(p->layer==DISP_LAYER_SEL)
	{								//从基本层转入选择层	
		p->layer--;
		p->cur_sel=0xff;
	}
}


void Menu_Mono_NextPage(MENU_MONO_T *p)
{
	int i;
	
	i=p->cur_page;
	if(++i>=p->page_n)
	{
		i=0;
	}
	p->cur_page=i;
	Menu_Mono_NewPage(p,i);
}

void Menu_Mono_PrevPage(MENU_MONO_T *p)
{
	int i;
	
	i=p->cur_page;
	if(--i<0)
	{
		i=p->page_n-1;
	}
	
	p->cur_page=i;
	Menu_Mono_NewPage(p,i);
}


void Menu_Mono_DispPage(MENU_MONO_T *p)
{
	int i;
	void *p_comp;
	
	if(p->menu_reset)
	{
		Menu_Mono_NewMenu(p,p->cur_menu,0);		//页面结构发生变化，重新计算一下
	}
	
	i=0;
	for(i=0;i<p->comp_n;i++)
	{
		p_comp=(void *)p->page[i];
		if(p_comp==NULL)
		{
			break;
		}
		p->cur_comp=i;
		Menu_Mono_DispComponent(p,p_comp);
	}
}


void Menu_Mono_DispComponent(MENU_MONO_T *p,void *comp)
{
	unsigned int i;
	U_COPONENT_T *u;
	u=comp;
	
	i=u->type;
	
	switch(i)
	{
		case CTP_TXT:		//静态文字
			Menu_Mono_Disp_TXT(p->disp_buf,&u->stxt);
			break;
		case CTP_DATA_DISP:		//数值显示元件
			Menu_Mono_Disp_DATA(p->disp_buf,&u->data,u->data.ctrl);
			break;
		case CTP_TXT_DATA_DISP:	//文数对应显示元件
			Menu_Mono_Disp_TXT_DATA(p->disp_buf,&u->txt_data,u->txt_data.ctrl);
			break;
		case CTP_DATA_SET:		//数值设定元件
			Menu_Mono_Disp_DATA_SET(p,&u->data_set);
			break;
		case CTP_TXT_DATA_SET:
			Menu_Mono_Disp_TXT_DATA_SET(p,&u->txt_data_set);
			break;
		case CTP_BMP:
			Menu_Mono_Disp_BMP(p,&u->bmp);
			break;
	}
}

//向缓冲区拷贝字符串
void set_disp_rev_buf(char *buf,char *s,unsigned short n,unsigned long ctrl)
{
	char *pc;
	int s_n;
	int space_n;
	
	if(ctrl > 0x20000000)
	{
		pc=(char *)ctrl;
		ctrl=*pc;
	}
	
	s_n=strlen(s);
	if(s_n<n)
	{
		space_n=n-s_n;
	}
	else
	{
		s_n=n;
		space_n=0;
	}
	pc=buf+DISP_LINE_N*DISP_COLUMN_N;
	
	if(ctrl==DISP_CTRL_NML)
	{
		memcpy(buf,s,s_n);
		memset(buf+s_n,' ',space_n);
		memset(pc,0,n);
	}
	else if(ctrl==DISP_CTRL_REV)
	{
		memcpy(buf,s,s_n);
		memset(buf+s_n,' ',space_n);
		memset(pc,1,n);
	}
	else if(ctrl==DISP_CTRL_FLASH)
	{
		memcpy(buf,s,s_n);
		memset(buf+s_n,' ',space_n);
		memset(pc,b_flash_250ms,n);
	}
	else
	{
		memset(buf,' ',n);
		memset(pc,0,n);
	}
}

void Menu_Mono_Disp_TXT(char *buf,MENU_TXT_T *p)
{	
	set_disp_rev_buf(&buf[p->y*MENU_MONO_COLUMN_N+p->x],p->p_txt,p->bytes,p->ctrl);	
}


void Menu_Mono_Disp_DATA(char *buf,MENU_DATA_DISP_T *p,unsigned long ctrl)
{
	int i,j;
	unsigned long ul;
	
	unsigned short disp_property;
	char ch[20];
	int int_n,dec_n;
	
	get_disp_data((MENU_MONO_DATA_T *)&ul,p);
	
	disp_property=p->disp_property;
	
	int_n=m_DP_INT_NB(disp_property);
	dec_n=m_DP_DEC_NB(disp_property);
	
	i=Dword2Str(ch,ul,int_n,dec_n,IS_DP_SIGN(disp_property),IS_DP_INV0(disp_property));

	if(IS_DP_STAR(disp_property))
	{
		for(j=0;j<i;j++)
		{
			if(ch[j]>='0' && ch[j]<='9')
			{
				ch[j]='*';
			}
		}
	}
	
	set_disp_rev_buf(&buf[p->y*MENU_MONO_COLUMN_N+p->x],ch,i,ctrl);
}


void Menu_Mono_Disp_TXT_DATA(char *buf,MENU_TXT_DATA_DISP_T *p,unsigned long ctrl)
{
	unsigned long ul;
	char ch[16]={0};
	char *pc;
		
	get_disp_data((MENU_MONO_DATA_T *)&ul,(MENU_DATA_DISP_T*)p);
		
	if(ul<p->index_n)
	{
		pc=p->txt_index[ul];
		memcpy(ch,pc,sizeof(ch));
	}

	set_disp_rev_buf(&buf[p->y*MENU_MONO_COLUMN_N+p->x],ch,p->size_x,ctrl);
}

//--------------------------------------------------------------------------------------------
//显示设定值
void Menu_Mono_Disp_DATA_SET(MENU_MONO_T *p,MENU_DATA_SET_T *comp)
{
	int i,j;
	unsigned long ul;
	char *pc;
	unsigned short disp_property;
	char ch[20];
	int int_n,dec_n;
	
	
	if(p->layer==DISP_LAYER_EDIT  && p->cur_sel==p->cur_comp)
	{
		//get_disp_data((MENU_MONO_DATA_T *)&ul,p);
		ul=p->edit.val;
		disp_property=comp->disp_property;
		int_n=m_DP_INT_NB(disp_property);
		dec_n=m_DP_DEC_NB(disp_property);
		
		i=Dword2Str(ch,ul,int_n,dec_n,IS_DP_SIGN(disp_property),1);
		
		pc=&p->disp_buf[comp->y*MENU_MONO_COLUMN_N+comp->x];
		memcpy(pc,ch,i);
		
		pc+=DISP_BUF_BYTES;		//指向对应的反白控制区
		
		memset(pc,0,i);			//先清零
		
		if(p->edit.b_flash)
		{
			if(dec_n !=0 && p->edit.cur_bit>=dec_n)
			{
				i--;
			}
			j=i-p->edit.cur_bit-1;	//指向闪烁位
			pc[j]=1;
		}
	}
	else
	{
		Menu_Mono_Disp_DATA(p->disp_buf,(MENU_DATA_DISP_T *)comp,(p->cur_sel==p->cur_comp));
	}
}

void Menu_Mono_Disp_TXT_DATA_SET(MENU_MONO_T *p,MENU_TXT_DATA_SET_T *comp)
{
	unsigned long ul;
	char ch[16]={0};
	char *pc;
	if(p->layer==DISP_LAYER_EDIT  && p->cur_sel==p->cur_comp)
	{	
		ul=p->edit.val;	
			
		if(ul<comp->index_n)
		{
			pc=comp->txt_index[ul];
			memcpy(ch,pc,sizeof(ch));
		}

		set_disp_rev_buf(&p->disp_buf[comp->y*MENU_MONO_COLUMN_N+comp->x],ch,comp->size_x,(p->edit.b_flash));
		
	}
	else
	{
		Menu_Mono_Disp_TXT_DATA(p->disp_buf,(MENU_TXT_DATA_DISP_T *)comp,(p->cur_sel==p->cur_comp));
	}
}
//--------------------------------------------------------------------------------------------
void Menu_Mono_Disp_BMP(MENU_MONO_T *p,MENU_BMP_T *comp)
{
	unsigned int i,x_bytes;
	char *buf;
	unsigned char *dot_buf;
	unsigned char *bmp_buf;
	
	buf=p->disp_buf + comp->y * MENU_MONO_COLUMN_N + comp->x;

	for(i=0;i<(comp->y_size);i++)			//向字符缓冲区填不操作特殊字符0x01
	{
		memset(buf,CHAR_NOPER,comp->x_size);
		buf+=MENU_MONO_COLUMN_N;
	}

	
	dot_buf=p->dot_buf + (comp->y * DISP_DOT_BYTE_COLUMN_N * MENU_MONO_COLUMN_N *2) + (comp->x * DISP_DOT_BYTE_COLUMN_N);
	bmp_buf=comp->rd_adr;
	
	x_bytes=comp->x_size*DISP_DOT_BYTE_COLUMN_N;
	for(i=0;i<comp->y_size*2;i++)		//每行高度16点阵
	{
		memcpy(dot_buf,bmp_buf,x_bytes);
		bmp_buf+=x_bytes;
		dot_buf+=(DISP_DOT_BYTE_COLUMN_N * MENU_MONO_COLUMN_N);
	}
}
//--------------------------------------------------------------------------------------------
void get_disp_data(MENU_MONO_DATA_T *u,MENU_DATA_DISP_T *p)
{
	float f;
	int i,j;
	
	switch(p->var_property)
	{
		case VTP_BIT:			//位变量
			u->ul=*(unsigned char *)p->adr != 0;
			break;
		case VTP_S8:			//有符号字节
			u->l=*(char *)p->adr;
			break;
		case VTP_U8:			//无符号字节
			u->ul=*(unsigned char *)p->adr;
			break;
		case VTP_S16:			//有符号短整
			u->l=*(short *)p->adr;
			break;
		case VTP_U16:		//无符号短整
			u->ul=*(unsigned short *)p->adr;
			break;
		case VTP_S32:			//有符号长整
			u->ul=*(unsigned long *)p->adr;
			break;
		case VTP_U32:			//无符号长整
			u->l=*(long *)p->adr;
			break;
		case VTP_FLOAT:			//浮点
			f=*(float *)p->adr;
			j=m_DP_DEC_NB(p->disp_property);
			for(i=0;i<j;i++)
			{
				f*=10;
			}
			u->l=f;
			break;
	}
}

